const express = require("express")
const  app = express()


//导入cors 中间件
const cors = require("cors")
//将cors注册为全局中间件
app.use(cors())

//配置解析表单数据的中间件
//注意：这个内置的中间件只能解析 application/x-www-form-urlencoded的表单数据
app.use(express.urlencoded({extended:false}))

var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({
    extended: false }))
app.use(bodyParser.json())

//一定要在路由之前，封装res.cc函数、
// 响应数据的中间件
app.use((req, res, next)=>{
  //status默认值为1， 表示失败的情况
  //err 的值，可能是一个错误对象，也可能是一个错误的描述字符串
  res.cc = function(err,status = 1){
    res.send({
      status,
      message: err instanceof Error ? err.message : err,
    })
  }


  next()
})

//解析Token的中间件
//导入配置文件
const config = require('./config')

//一定要在路由之前解析token的中间件
const expressJWT = require('express-jwt')
//使用 .unless({path:[/^\/api\//]})指定那些接口不需要进行Token的身份认证
app.use(expressJWT({
  secret:config.jwtSecretKey
}).unless({
  path:[/^\/api\//,/^\/echart\//]
}))

//导入并注册用户路由模块
const userRouter = require('./router/user.js')
app.use('/api',userRouter)

//导入使用用户信息路由模块
const userinfoRouter = require('./router/userinfo')
//注意：以/my开头的接口，都是有权限的接口，需要进行Token身份认证
app.use('/my',userinfoRouter)

const artCateRouter = require('./router/artcate.js')
app.use('/my/article',artCateRouter)



const echartsRouter = require('./router/echarts.js')
app.use('/echart',echartsRouter)



//定义错误级别中间件，铺货验证失败的错误
const joi = require('joi')
const { required } = require("joi")
app.use(function (err,req,res,next){
  if(err instanceof joi.ValidationError){
    return res.cc(err)
  }
  //身份错误的失败
  if(err.name === 'UnauthorizedError'){
    return res.cc(身份认证失败)
  }

  res.cc(err)
})

//启动服务器
app.listen(3007, () => {
  console.log('api server running at http://127.0.0.1:3007');

})